package banco.estoque;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import banco.Conexao;
import excecoes.estoque.DinheiroNegativoException;
import excecoes.estoque.NenhumProdutoEncontradoException;
import excecoes.estoque.ProdutoCadastradoException;
import excecoes.estoque.QuantidadeNegativaException;
import javax.swing.JOptionPane;
import smartMarket.estoque.Produto;

public class BancoProduto extends Conexao {

    //Construtor
    public BancoProduto() {
        super();
    }

    // Métodos
    private Produto retornar(ResultSet rs) throws SQLException, DinheiroNegativoException, NumberFormatException, QuantidadeNegativaException {
        Produto produto = new Produto();

        produto.setCodigo(rs.getInt("codigo"));
        produto.setCodigoDeBarras(rs.getString("codigoBarra"));
        produto.setDescricao(rs.getString("descricao"));
        produto.setPreco((float) rs.getDouble("preco"));
        produto.setCusto(rs.getFloat("custo"));
        produto.setQuantidade(rs.getInt("estoque"));
        produto.setQuantidadeMinima(rs.getInt("estoqueMin"));
        produto.setAtivo(rs.getBoolean("ativo"));

        return produto;
    }

    public Produto buscar(int codigo) throws SQLException, DinheiroNegativoException, NumberFormatException, QuantidadeNegativaException, NenhumProdutoEncontradoException {

        PreparedStatement st = conexao.prepareStatement("select * from produto where codigo = ?");
        st.setInt(1, codigo);
        ResultSet rs = st.executeQuery();

        if (!rs.next()) {
            throw new NenhumProdutoEncontradoException();
        }

        return retornar(rs);

    }

    public Produto buscar(String codigoBarra) throws SQLException, DinheiroNegativoException, NumberFormatException, QuantidadeNegativaException, NenhumProdutoEncontradoException {

        PreparedStatement st = conexao.prepareStatement("select * from produto where codigoBarra = ?");
        st.setString(1, codigoBarra);
        ResultSet rs = st.executeQuery();

        if (!rs.next()) {
            throw new NenhumProdutoEncontradoException();
        }

        return retornar(rs);
    }   
    
    public void novo(Produto produto) throws SQLException, NullPointerException, ProdutoCadastradoException {

        Statement sst = conexao.createStatement();
        ResultSet rss = sst.executeQuery("select * from produto where codigoBarra = " + produto.getCodigoDeBarras());

        if (!rss.next()) {
            PreparedStatement st = conexao.prepareStatement("insert into produto(codigoBarra,descricao,estoque,estoqueMin,ativo,preco,custo) "
                    + "values (?,?,?,?,?,?,?)");
            st.setString(1, produto.getCodigoDeBarras());
            st.setString(2, produto.getDescricao());
            st.setInt(3, produto.getQuantidade());
            st.setInt(4, produto.getQuantidadeMinima());
            st.setBoolean(5, produto.getAtivo());
            st.setDouble(6, produto.getPreco());
            st.setFloat(7, produto.getCusto());
            st.execute();
        } else {
            throw new ProdutoCadastradoException();
        }

    }

    public void excluir(Produto produto) throws SQLException {

        PreparedStatement sst = conexao.prepareStatement("delete from produto where codigo = ?");
        sst.setInt(1, produto.getCodigo());
        sst.execute();

    }

    public void alterar(Produto produto) throws SQLException {

        PreparedStatement sst = conexao.prepareStatement("update produto set codigoBarra = ?, descricao = ?, estoque = ?, "
                + " estoqueMin = ?, ativo = ?, preco = ?, custo = ? where codigo = ?");

        sst.setString(1, produto.getCodigoDeBarras());
        sst.setString(2, produto.getDescricao());
        sst.setInt(3, produto.getQuantidade());
        sst.setInt(4, produto.getQuantidadeMinima());
        sst.setBoolean(5, produto.getAtivo());
        sst.setDouble(6, produto.getPreco());
        sst.setFloat(7, produto.getCusto());
        sst.setInt(8, produto.getCodigo());
        sst.execute();

    }

    public int ultimoProduto() throws SQLException, DinheiroNegativoException, NumberFormatException, QuantidadeNegativaException, NenhumProdutoEncontradoException {

        PreparedStatement st = conexao.prepareStatement("SELECT MAX(codigo) AS maximo FROM produto");

        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            return 1;
        }
        return rs.getInt("maximo");
    }

    public Vector<Produto> listar() throws SQLException, DinheiroNegativoException, NumberFormatException, QuantidadeNegativaException {

        Vector<Produto> produtos = new Vector<Produto>();
        PreparedStatement st = conexao.prepareStatement("select * from produto ORDER BY CODIGO");
        ResultSet rs = st.executeQuery();

        if (!rs.next()) {
            return null;
        } else {
            produtos.add(retornar(rs));
            while (rs.next()) {
                produtos.add(retornar(rs));
            }
        }

        return produtos;
    }
    
    public Vector<Produto> buscarDescicao(String descricao) {

        try {
            Vector<Produto> produtos = new Vector<Produto>();
            Statement st = conexao.createStatement();
            ResultSet rs = st.executeQuery("select * from produto where descricao like '%" + descricao + "%'");
            if (!rs.next()) {
                JOptionPane.showMessageDialog(null, "Nenhum produto encontrado");
                return null;
            } else {
                produtos.add(retornar(rs));
                while (rs.next()) {
                    produtos.add(retornar(rs));
                }
                return produtos;
            }
            
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao buscar produto " + e.getMessage());
            return null;
        }
    }    

    
}
